package com.bjpowernode.service.impl;

import cn.hutool.core.bean.BeanUtil;
import com.alibaba.excel.EasyExcel;
import com.bjpowernode.constant.Constant;
import com.bjpowernode.entity.TClue;
import com.bjpowernode.listener.ClueExcelListener;
import com.bjpowernode.mapper.TClueMapper;
import com.bjpowernode.query.BaseQuery;
import com.bjpowernode.query.ClueExcelQuery;
import com.bjpowernode.query.ClueQuery;
import com.bjpowernode.service.ClueService;
import com.bjpowernode.util.LoginInfoUtil;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import jakarta.annotation.Resource;
import org.springframework.stereotype.Service;

import java.io.InputStream;
import java.util.Date;
import java.util.List;

/**
 * 线索服务实现类
 * 实现ClueService接口，处理线索管理相关的业务逻辑
 */
@Service
public class ClueServiceImpl implements ClueService {
    /**
     * 线索数据访问对象
     * 用于与数据库交互，执行线索相关的CRUD操作
     */
    @Resource
    private TClueMapper tClueMapper;

    /**
     * 分页查询线索列表
     * @param current 当前页码
     * @return 包含分页线索数据的PageInfo对象
     */
    @Override
    public PageInfo<TClue> getClueByPage(Integer current) {
        // 使用PageHelper开启分页，每页大小从常量类获取
        PageHelper.startPage(current, Constant.PAGE_SIZE);
        // 调用mapper查询线索列表（使用空查询条件对象）
        List<TClue> clueList = tClueMapper.selectClueByPage(new BaseQuery());
        // 封装分页结果并返回
        PageInfo<TClue> pageInfo = new PageInfo<>(clueList);
        return pageInfo;
    }

    /**
     * 根据ID查询线索详情
     * @param id 线索ID
     * @return 对应的线索实体对象，若不存在则返回null
     */
    @Override
    public TClue getClueById(Integer id) {
        // 直接调用mapper根据ID查询线索
        return tClueMapper.selectClueById(id);
    }

    /**
     * 添加新线索
     * @param clueQuery 线索新增请求参数对象
     * @return 数据库操作影响行数（1表示成功，0表示失败）
     */
    @Override
    public int addClue(ClueQuery clueQuery) {
        TClue tClue = new TClue();
        // 将查询对象属性拷贝到实体对象
        BeanUtil.copyProperties(clueQuery, tClue);
        // 设置创建时间为当前时间
        tClue.setOwnerId(LoginInfoUtil.getCurrentLoginUser().getId());
        tClue.setCreateTime(new Date());
        // 设置创建者为当前登录用户ID
        tClue.setCreateBy(LoginInfoUtil.getCurrentLoginUser().getId());
        // 插入用户记录并返回影响行数（使用选择性插入，只插入非空字段）
        int count = tClueMapper.insertSelective(tClue);
        return count;
    }

    /**
     * 修改线索信息
     * @param clueQuery 线索修改请求参数对象
     * @return 数据库操作影响行数（1表示成功，0表示失败）
     */
    @Override
    public int editClue(ClueQuery clueQuery) {
        TClue tClue = new TClue();
        // 将查询对象属性拷贝到实体对象
        BeanUtil.copyProperties(clueQuery, tClue);
        // 设置修改时间为当前时间
        tClue.setEditTime(new Date());
        // 设置修改者为当前登录用户ID
        tClue.setEditBy(LoginInfoUtil.getCurrentLoginUser().getId());
        // 更新用户记录并返回影响行数（使用选择性更新，只更新非空字段）
        int count = tClueMapper.updateByPrimaryKeySelective(tClue);
        return count;
    }

    /**
     * 根据ID删除线索
     * @param id 要删除的线索ID
     * @return 数据库操作影响行数（1表示成功删除，0表示未找到对应线索）
     */
    @Override
    public int deleteClue(Integer id) {
        return tClueMapper.deleteByPrimaryKey(id);
    }

    /**
     * 批量删除线索
     * @param list 线索ID字符串列表，每个元素为一个线索ID
     * @return 数据库操作影响行数，即成功删除的线索数量
     */
    @Override
    public int deleteClues(List<String> list) {
        return tClueMapper.deleteClues(list);
    }

    /**
     * Excel线索导入处理方法
     * 接收Excel文件输入流，通过EasyExcel解析并批量保存线索数据
     * @param inputStream Excel文件输入流（通常来自前端上传的文件）
     */
    @Override
    public void importExcel(InputStream inputStream) {
        // 获取当前登录用户ID，用于设置导入线索的创建者
        Integer loginUserId = LoginInfoUtil.getCurrentLoginUser().getId();

        // 使用EasyExcel读取Excel文件：
        // 1. 指定输入流和数据模型类(ClueExcelQuery)
        // 2. 绑定自定义监听器(ClueExcelListener)，传入数据库操作Mapper和创建者ID
        // 3. 读取第一个工作表(sheet())并执行解析(doRead())
        EasyExcel.read(inputStream, ClueExcelQuery.class, new ClueExcelListener(tClueMapper, loginUserId)).sheet().doRead();
    }
}
